import {
  uploadSingleFile,
  uploadMultipleFiles,
  getFileList,
  deleteFile,
  getFileUrl,
  uploadFileWithProgress,
  uploadMultipleFilesWithProgress,
  validateFile,
  validateMultipleFiles
} from './fileUpload'

// 使用示例

/**
 * 单文件上传示例
 */
export const singleFileUploadExample = async () => {
  try {
    // 假设从input元素获取文件
    const fileInput = document.getElementById('fileInput')
    const file = fileInput.files[0]
    
    if (!file) {
      console.log('请选择文件')
      return
    }
    
    // 验证文件
    const validation = validateFile(file)
    if (!validation.valid) {
      console.log('文件验证失败:', validation.errors)
      return
    }
    
    // 上传文件
    const result = await uploadSingleFile(file)
    console.log('上传成功:', result)
    
    // 获取文件访问URL
    const fileUrl = getFileUrl(result.data.filename, result.data.mimetype.split('/')[0])
    console.log('文件访问地址:', fileUrl)
    
  } catch (error) {
    console.error('上传失败:', error)
  }
}

/**
 * 多文件上传示例
 */
export const multipleFilesUploadExample = async () => {
  try {
    // 假设从input元素获取多个文件
    const fileInput = document.getElementById('multipleFileInput')
    const files = Array.from(fileInput.files)
    
    if (files.length === 0) {
      console.log('请选择文件')
      return
    }
    
    // 验证文件
    const validation = validateMultipleFiles(files)
    if (!validation.valid) {
      console.log('文件验证失败:', validation.errors)
      return
    }
    
    // 上传文件
    const result = await uploadMultipleFiles(validation.validFiles)
    console.log('批量上传成功:', result)
    
  } catch (error) {
    console.error('批量上传失败:', error)
  }
}

/**
 * 带进度监控的文件上传示例
 */
export const progressUploadExample = () => {
  const fileInput = document.getElementById('progressFileInput')
  const file = fileInput.files[0]
  
  if (!file) {
    console.log('请选择文件')
    return
  }
  
  // 验证文件
  const validation = validateFile(file)
  if (!validation.valid) {
    console.log('文件验证失败:', validation.errors)
    return
  }
  
  // 上传文件（带进度监控）
  const xhr = uploadFileWithProgress(
    file,
    // 进度回调
    (percent) => {
      console.log(`上传进度: ${percent.toFixed(2)}%`)
      // 更新进度条
      updateProgressBar(percent)
    },
    // 成功回调
    (result) => {
      console.log('上传成功:', result)
      showSuccessMessage('文件上传成功！')
    },
    // 错误回调
    (error) => {
      console.error('上传失败:', error)
      showErrorMessage('文件上传失败：' + error.message)
    }
  )
  
  // 可以取消上传
  // xhr.abort()
}

/**
 * 批量文件上传（带进度监控）示例
 */
export const multipleProgressUploadExample = () => {
  const fileInput = document.getElementById('multipleProgressFileInput')
  const files = Array.from(fileInput.files)
  
  if (files.length === 0) {
    console.log('请选择文件')
    return
  }
  
  // 验证文件
  const validation = validateMultipleFiles(files)
  if (!validation.valid) {
    console.log('文件验证失败:', validation.errors)
    return
  }
  
  // 批量上传文件（带进度监控）
  uploadMultipleFilesWithProgress(
    validation.validFiles,
    // 总体进度回调
    (totalPercent) => {
      console.log(`总体进度: ${totalPercent.toFixed(2)}%`)
      updateTotalProgressBar(totalPercent)
    },
    // 单个文件进度回调
    (fileIndex, fileName, filePercent) => {
      console.log(`文件 ${fileName} 进度: ${filePercent.toFixed(2)}%`)
      updateFileProgressBar(fileIndex, filePercent)
    },
    // 成功回调
    (results) => {
      console.log('批量上传成功:', results)
      showSuccessMessage(`成功上传 ${results.length} 个文件！`)
    },
    // 错误回调
    (errors) => {
      console.error('批量上传失败:', errors)
      showErrorMessage(`上传失败 ${errors.length} 个文件`)
    }
  )
}

/**
 * 获取文件列表示例
 */
export const getFileListExample = async () => {
  try {
    // 获取所有文件
    const allFiles = await getFileList()
    console.log('所有文件:', allFiles)
    
    // 获取特定类型的文件
    const imageFiles = await getFileList({ type: 'image', page: 1, limit: 10 })
    console.log('图片文件:', imageFiles)
    
    // 获取文档文件
    const docFiles = await getFileList({ type: 'application', page: 1, limit: 20 })
    console.log('文档文件:', docFiles)
    
  } catch (error) {
    console.error('获取文件列表失败:', error)
  }
}

/**
 * 删除文件示例
 */
export const deleteFileExample = async (filename, type) => {
  try {
    const result = await deleteFile(filename, type)
    console.log('删除成功:', result)
    showSuccessMessage('文件删除成功！')
  } catch (error) {
    console.error('删除失败:', error)
    showErrorMessage('文件删除失败：' + error.message)
  }
}

/**
 * 文件管理示例
 */
export const fileManagementExample = async () => {
  try {
    // 1. 获取文件列表
    const fileList = await getFileList({ page: 1, limit: 50 })
    
    // 2. 显示文件列表
    displayFileList(fileList.data.files)
    
    // 3. 为每个文件添加操作按钮
    fileList.data.files.forEach(file => {
      addFileActions(file)
    })
    
  } catch (error) {
    console.error('文件管理失败:', error)
  }
}

// 辅助函数（需要根据实际UI框架实现）

function updateProgressBar(percent) {
  // 更新进度条显示
  const progressBar = document.getElementById('progressBar')
  if (progressBar) {
    progressBar.style.width = percent + '%'
    progressBar.textContent = percent.toFixed(1) + '%'
  }
}

function updateTotalProgressBar(percent) {
  // 更新总体进度条
  const totalProgressBar = document.getElementById('totalProgressBar')
  if (totalProgressBar) {
    totalProgressBar.style.width = percent + '%'
    totalProgressBar.textContent = percent.toFixed(1) + '%'
  }
}

function updateFileProgressBar(fileIndex, percent) {
  // 更新单个文件进度条
  const fileProgressBar = document.getElementById(`fileProgress_${fileIndex}`)
  if (fileProgressBar) {
    fileProgressBar.style.width = percent + '%'
    fileProgressBar.textContent = percent.toFixed(1) + '%'
  }
}

function showSuccessMessage(message) {
  // 显示成功消息
  console.log('✅', message)
  // 根据实际UI框架实现
}

function showErrorMessage(message) {
  // 显示错误消息
  console.error('❌', message)
  // 根据实际UI框架实现
}

function displayFileList(files) {
  // 显示文件列表
  console.log('显示文件列表:', files)
  // 根据实际UI框架实现
}

function addFileActions(file) {
  // 为文件添加操作按钮
  console.log('为文件添加操作:', file)
  // 根据实际UI框架实现
}

// 导出所有示例函数
export default {
  singleFileUploadExample,
  multipleFilesUploadExample,
  progressUploadExample,
  multipleProgressUploadExample,
  getFileListExample,
  deleteFileExample,
  fileManagementExample
} 